/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package controladores;

import controladores.exceptions.NonexistentEntityException;
import entidades.Sesion;
import entidades.Usuario;
import java.math.BigInteger;
import java.security.SecureRandom;
import java.util.Calendar;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.RollbackException;

/**
 *
 * @author fcarou
 */
public class SesionJpaController extends BaseControlador
{
    public SesionJpaController ()
    {
        super ();
    }
    
    public SesionJpaController(EntityManager em)
    {
        super(em);
    }
    
    public Sesion buscarSesion (String codigo)
    {
        Query query = em.createNamedQuery("sesionPorCodigo");
        query.setParameter(1, codigo);
        
        try
        {
            return (Sesion) query.getResultList().get(0);
        }
        catch (IndexOutOfBoundsException ex)
        {
            return null;
        }
    }
    
    public Sesion iniciarSesion (Usuario usuario)
    {
        if (usuario.getUsuario() == null || usuario.getClave() == null)
            return null;
        
        UsuarioJpaController con = new UsuarioJpaController(em);
        
        Usuario res = con.buscarUsuario(usuario);
        
        if (res == null || !res.isHabilitado())
            return null;
        
        Sesion sesion = new Sesion();
        
        sesion.setInicio(Calendar.getInstance());
        sesion.setUsuario(res);
        
        SecureRandom ran = new SecureRandom();
        String codigo = new BigInteger(250, ran).toString(32);
        
        while (buscarSesion(codigo) != null)
            codigo = new BigInteger(250, ran).toString(32);
        
        sesion.setCodigo(codigo);
        
        create(sesion);
        
        return sesion;
    }
    
    public boolean cerrarSesion (String codigo)
    {
        Sesion sesion = buscarSesion(codigo);
        
        if (sesion != null)
        {
            sesion.setCierre(Calendar.getInstance());
            edit(sesion);
            
            return true;
        }
        
        return false;
    }
    
    public boolean checkCodigoSesion (String codigo)
    {
        Sesion sesion = buscarSesion(codigo);
        
        return sesion != null && sesion.getCierre() == null;
    }
    
    public Usuario getUsuarioSesion (String codigo)
    {
        Sesion sesion = buscarSesion (codigo);
        
        if (sesion != null && sesion.getCierre() == null)
            return sesion.getUsuario();
        
        return null;
    }
}
